package com.qp.basics.estivate;

import java.util.List;

/**
 * 基本从JPA剽窃来的。 但JPA的规范根据其JQL的内容来决定返回对象的类型，我们不太会定义一套新的QL。 但如何处理select count(*)
 * from table的情况，现在提供了 getResultList(ResultSetExtractor
 * extractor)和getSingleResult(ResultSetExtractor extractor)
 * 两个方法，即ResultSetExtractor的机制。 另外又提供了
 * getSingleColumnResult和getSingleColumnResultList两个快捷方法。
 * 
 * 
 * ！！！不明确声明异常的话，是有些危险的，使用者可能不会对运行时异常进行处理从而导致有不关闭连接。
 */
public interface Query {
	/**
	 * 返回查询结果集。 目前的实现List的元素由extractor决定。
	 * 
	 * @return
	 */
	List getResultList(ResultSetExtractor extractor);

	/**
	 * 返回查询结果。 目前返回的元素类型由extractor决定。
	 * 
	 * @return
	 */
	Object getSingleResult(ResultSetExtractor extractor);

	/**
	 * 返回查询结果集。 目前的实现List的元素都是Map。
	 * 
	 * @return
	 */
	List getResultList();

	/**
	 * 返回查询结果。 目前返回的元素类型都是Map。
	 * 
	 * @return
	 */
	Object getSingleResult();

	/**
	 * 针对单字段情况的处理。
	 * 
	 * @return
	 */
	Object getSingleColumnResult();

	/**
	 * 针对单字段情况的处理。
	 * 
	 * @return
	 */
	List getSingleColumnResultList();

	/**
	 * 修改操作。
	 * 
	 * @return
	 */
	int executeUpdate();

	/**
	 * 返回的最大记录数。 用户分页和hibernate类似。
	 * 
	 * @param i
	 * @return
	 */
	Query setMaxResults(int i);

	/**
	 * 起始记录位置。 从0开始。
	 * 
	 * @param i
	 * @return
	 */
	Query setFirstResult(int i);

	/**
	 * 暂时未实现。 Set an implementation-specific hint. If the hint name is not
	 * recognized, it is silently ignored.
	 * 
	 * @param s
	 * @param obj
	 * @return
	 */
	Query setHint(String s, Object obj);

	/**
	 * 设置参数。 如select * from tableName where colName1=#colName1# 目前尚未实现。
	 * 
	 * @param s
	 * @param obj
	 * @return
	 */
	Query setParameter(String s, Object obj);

	/**
	 * 设置参数。 已经实现。
	 * 
	 * @param i
	 * @param obj
	 * @return
	 */
	Query setParameter(int i, Object obj);

	void setSql(String sql);

	void setSession(Session session);

	List getGeneratedKeys();

	Object getGeneratedKey();
	// Query setParameter(String s, Date date, TemporalType temporaltype);
	//
	// Query setParameter(String s, Calendar calendar, TemporalType
	// temporaltype);

	// Query setParameter(int i, Date date, TemporalType temporaltype);
	//
	// Query setParameter(int i, Calendar calendar, TemporalType temporaltype);
	//
	// Query setFlushMode(FlushModeType flushmodetype);
}
